#pragma once

#include <iostream>

#include "Protocol.hpp"

namespace CalCulate_Ns
{

    enum class ErrCode // 枚举类 ， 防止命名空间污染，传统的枚举类型会污染当前作用域
    {
        Success = 0,
        DivZeroErr,
        ModZeroErr,
        UnknowErr,
    };

    class Calculate
    {
        Protocol::Factory _facotry;

    public:
        Calculate() {}
        ~Calculate() {}

        std::shared_ptr<Protocol::Response> Cal(std::shared_ptr<Protocol::Request> &req)
        {
            std::shared_ptr<Protocol::Response> resp = _facotry.BuildResponse();

            switch (req->Get_oper())
            {
            case '+':
                resp->Set_result(req->Get_data_x() + req->Get_data_y());
                break;
            case '-':
                resp->Set_result(req->Get_data_x() - req->Get_data_y());
                break;
            case '*':
                resp->Set_result(req->Get_data_x() * req->Get_data_y());
                break;
            case '/':
                if (req->Get_data_y() != 0)
                    resp->Set_result(req->Get_data_x() / req->Get_data_y());
                else
                    resp->Set_code((int)ErrCode::DivZeroErr); // 设置错误码
                break;
            case '%':
                if (req->Get_data_y() != 0)
                    resp->Set_result(req->Get_data_x() % req->Get_data_y());
                else
                    resp->Set_code((int)ErrCode::ModZeroErr); // 设置错误码
                break;
            default:
                resp->Set_code((int)ErrCode::UnknowErr); // 设置错误码
                break;
            }

            return resp;  // 返回 response 
        }
    };

}